namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement an ComplexPoint2D class.
    /// </summary>
    public interface IComplexPoint2D
    {
        /// <summary>
        /// Gets or sets the x value of the complex point.
        /// </summary>
        /// <value>The x value of the complex point.</value>
        ComplexNumber X { get; set; }

        /// <summary>
        /// Gets or sets the y value of the complex point.
        /// </summary>
        /// <value>The y value of the complex point.</value>
        ComplexNumber Y { get; set; }

        /// <summary>
        /// Adds a x and y value to the current point instance.
        /// </summary>
        /// <param name="xValue">The x value.</param>
        /// <param name="yValue">The y value.</param>
        void Add(ComplexNumber xValue, ComplexNumber yValue);

        /// <summary>
        /// Copies the current instance of the complex point.
        /// </summary>
        /// <returns>A copy of the current complex point instance.</returns>
        ComplexPoint2D Copy();

        /// <summary>
        /// Scales the position elements x and y with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(double scaleFactor);

        /// <summary>
        /// Scales the position elements x and y with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(ComplexNumber scaleFactor);

        /// <summary>
        /// Scales the position elements x and y with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        void ScaleTransformation(double scaleFactorX, double scaleFactorY);

        /// <summary>
        /// Scales the position elements x and y with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        void ScaleTransformation(ComplexNumber scaleFactorX, ComplexNumber scaleFactorY);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValue">The translate value for the x- and y position.</param>
        void TranslateTransformation(double translateValue);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValue">The translate value for the x- and y position.</param>
        void TranslateTransformation(ComplexNumber translateValue);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        void TranslateTransformation(double translateValueX, double translateValueY);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        void TranslateTransformation(ComplexNumber translateValueX, ComplexNumber translateValueY);

        /// <summary>
        /// Determines whether the position elements are zero.
        /// </summary>
        /// <returns>
        /// 	<c>true</c> if the position elements are zero; otherwise, <c>false</c>.
        /// </returns>
        bool IsZero();

        /// <summary>
        /// Converts the current point to a complex vector.
        /// </summary>
        /// <returns>The converted complex vector.</returns>
        GeneralComplexVector ToVector();

        /// <summary>
        /// Converts the current point to a complex matrix.
        /// </summary>
        /// <returns>The converted complex matrix.</returns>
        ComplexMatrix ToMatrix();
    }
}